package com.yc.cglib;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author zwei
 * @create 2024-08-03 16:28
 */
public class MyInterceptor implements MethodInterceptor {
    private Object target;

    public MyInterceptor(Object target) {
        this.target = target;
    }

    public Object createProxy() {
        //用cglib动态代理对象
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());  //设置代理对象的父类
        enhancer.setCallback(this);
        return enhancer.create();
    }

    //对比jdk动态代理  代理类的方法  是由代理类的invoke方法调用的
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        //1.什么时候调用增强
        if (method.getName().startsWith("show") ||
                method.getName().startsWith("save") ||
                method.getName().startsWith("update")) {
            checkRights();
        }
        //2.调用目标方法
        Object result = method.invoke(target, args);    //target.method(target)
        if (method.getName().startsWith("show") ||
                method.getName().startsWith("save") ||
                method.getName().startsWith("update")) {
            recordLog();
        }
        return result;
    }

    private void recordLog() {
        System.out.println("权限验证");
    }

    private void checkRights() {
        System.out.println("日志记录");
    }
}
